/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientAssociation;
import fr.generali.accueilclient.client.om.IClientAutre;
import fr.generali.accueilclient.client.om.IClientEntreprise;
import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.IPersonneMorale;
import fr.generali.accueilclient.client.om.IPersonnePhysique;
import fr.generali.accueilclient.client.om.ISphereProfessionnelle;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.refservcommuns.rce.demat.communmajmarketing.majmarketing.DtoMajProfilMarketing;
import fr.generali.refservcommuns.rce.demat.modificationpersonne.modificationpersonneservice.ModifierPersonne;
import fr.generali.refservcommuns.rce.demat.modificationpersonne.dtomodifpersonne.DtoDossierP13;
import fr.generali.refservcommuns.rce.demat.modificationpersonne.dtomodifpersonne.DtoListeDossierP13;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonneMorale;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonnePhysique;

/**
 * @author selrhazala
 */
@Component("personneToModifierPersonneConverter")
public class PersonneToModifierPersonneConverter implements Converter<IPersonne, ModifierPersonne> {

    /**
     * Code user
     */
    private static final String CODE_USER = "BC";

    /**
     * Assembler pour une personne physique
     */
    @Autowired
    @Qualifier("personnePhysiqueToDtoPersonnePhysiqueConverter")
    private Converter<IPersonnePhysique, DtoPersonnePhysique> personnePhysiqueToDtoPersonnePhysiqueConverter;

    /**
     * Assembler pour une personne morale
     */
    @Autowired
    @Qualifier("personneMoraleToDtoPersonneMoraleConverter")
    private Converter<IPersonneMorale, DtoPersonneMorale> personneMoraleToDtoPersonneMoraleConverter;

    /**
     * Assembler pour le pro côté personne morale
     */
    @Autowired
    @Qualifier("personnePhysiqueToDtoPersonneMoraleConverter")
    private Converter<IPersonnePhysique, DtoPersonneMorale> personnePhysiqueToDtoPersonneMoraleConverter;

    /**
     * {@inheritDoc}
     */
    public ModifierPersonne convert(IPersonne input) {
        ModifierPersonne modifierPersonne = null;
        if (input != null) {
            modifierPersonne = new ModifierPersonne();
            DtoDossierP13 dtoDossierP13 = new DtoDossierP13();

            DtoDossierP13 dtoDossierP13ProPM = new DtoDossierP13();

            // init date du jour
            XMLGregorianCalendar dateDuJour = null;
            try {
                GregorianCalendar gCalendar1 = new GregorianCalendar();
                gCalendar1.setTime(new Date());
                dateDuJour = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar1);
            } catch (DatatypeConfigurationException e) {
                // TODO Auto-generated catch block
                e.getMessage();
            }

            if (input.isPersonnePhysique()) {
                IPersonnePhysique personnePhysique = IPersonnePhysique.class.cast(input);
                if (NaturePersonne.PROFESSIONNEL.equals(personnePhysique.getNaturePersonne())) {
                    dtoDossierP13ProPM.setCodeUser(CODE_USER);
                    dtoDossierP13ProPM.setPersonneMorale(personnePhysiqueToDtoPersonneMoraleConverter
                                    .convert(personnePhysique));
                    IClientProfessionnel clientProfessionnel = IClientProfessionnel.class.cast(personnePhysique);
                    dtoDossierP13.getIdSpherePro().add(clientProfessionnel.getSphereProfessionnelle().getIdSpherePro());
                    dtoDossierP13ProPM.setIdentifiantPersonne(clientProfessionnel.getSphereProfessionnelle()
                                    .getIdSpherePro());
                    dtoDossierP13ProPM.setProfilMarketing(buildProfilMarketingProPM(
                                    clientProfessionnel.getSphereProfessionnelle(), dateDuJour));
                }
                dtoDossierP13.setPersonnePhysique(personnePhysiqueToDtoPersonnePhysiqueConverter
                                .convert(personnePhysique));
                dtoDossierP13.setIdentifiantPersonne(personnePhysique.getNumeroClient());
            } else {
                IPersonneMorale personneMorale = IPersonneMorale.class.cast(input);
                dtoDossierP13.setPersonneMorale(personneMoraleToDtoPersonneMoraleConverter.convert(personneMorale));
                dtoDossierP13.setIdentifiantPersonne(personneMorale.getNumeroClient());
            }

            dtoDossierP13.setCodeUser(CODE_USER);
            dtoDossierP13.setProfilMarketing(buildProfilMarketing(input, dateDuJour));

            List<DtoDossierP13> listeDtoDossierP13 = new ArrayList<DtoDossierP13>();
            listeDtoDossierP13.add(dtoDossierP13);

            if (NaturePersonne.PROFESSIONNEL.equals(input.getNaturePersonne())) {
                listeDtoDossierP13.add(dtoDossierP13ProPM);
            }

            DtoListeDossierP13 dtoListeDossierP13 = new DtoListeDossierP13();
            dtoListeDossierP13.getDossierPersonne().addAll(listeDtoDossierP13);
            modifierPersonne.setDtoListeDossierP13(dtoListeDossierP13);
        }

        return modifierPersonne;
    }

    /**
     * @param client le client
     * @param dateDuJour la date du jour
     * @return DtoMajProfilMarketing le profil marketing du client à créer
     */
    public DtoMajProfilMarketing buildProfilMarketing(IPersonne client, XMLGregorianCalendar dateDuJour) {

        String nbSites = StringUtils.EMPTY;
        switch (client.getNaturePersonne()) {
            case PARTICULIER:
                nbSites = client.getNbResidences();
                break;
            case PROFESSIONNEL:
                nbSites = client.getNbResidences();
                break;
            case ASSOCIATION:
                nbSites = IClientAssociation.class.cast(client).getNbSites();
                break;
            case COLLECTIVITE:
                nbSites = client.getNbResidences();
                break;
            case COPROPRIETE:
                nbSites = client.getNbResidences();
                break;
            case ENTREPRISE:
                nbSites = IClientEntreprise.class.cast(client).getNbSites();
                break;
            default:
                nbSites = IClientAutre.class.cast(client).getNbSites();
                break;
        }

        DtoMajProfilMarketing dtoMajProfilMarketing = new DtoMajProfilMarketing();
        if (StringUtils.isNotEmpty(nbSites)) {
            dtoMajProfilMarketing.setNombreBiensImmobiliers(BigInteger.valueOf(Long.parseLong(nbSites)));
        }
        dtoMajProfilMarketing.setDateMiseAJourNombreBienImmobiliers(dateDuJour);
        if (StringUtils.isNotEmpty(client.getNbVehicules())) {
            dtoMajProfilMarketing.setNombreVehicules(BigInteger.valueOf(Long.parseLong(client.getNbVehicules())));
        }
        dtoMajProfilMarketing.setDateMiseaJourNombreVehicules(dateDuJour);
        dtoMajProfilMarketing.setPollicitable(client.isPollicitable());
        dtoMajProfilMarketing.setAssurableEnSante(client.isAssurableEnSante());

        return dtoMajProfilMarketing;
    }

    /**
     * @param spherePro la sphere professionnelle du client pro
     * @param dateDuJour la date du jour
     * @return DtoMajProfilMarketing le profil marketing du client à créer
     */
    public DtoMajProfilMarketing buildProfilMarketingProPM(ISphereProfessionnelle spherePro,
                    XMLGregorianCalendar dateDuJour) {
        DtoMajProfilMarketing dtoMajProfilMarketing = new DtoMajProfilMarketing();
        if (StringUtils.isNotEmpty(spherePro.getNbSites())) {
            dtoMajProfilMarketing.setNombreBiensImmobiliers(BigInteger.valueOf(Long.parseLong(spherePro.getNbSites())));
        }
        dtoMajProfilMarketing.setDateMiseAJourNombreBienImmobiliers(dateDuJour);
        if (StringUtils.isNotEmpty(spherePro.getNbVehicules())) {
            dtoMajProfilMarketing.setNombreVehicules(BigInteger.valueOf(Long.parseLong(spherePro.getNbVehicules())));
        }
        dtoMajProfilMarketing.setDateMiseaJourNombreVehicules(dateDuJour);

        return dtoMajProfilMarketing;
    }
}
